//6．一个文本文件中保存着一个垒球队的信息。每行数据都是这样排列：
//4 Jessie Joybat 5 2 1 1

//第1项是球员号，为方便起见，其范围是0～18。第2项是球员的名。第3项是球员的姓。名和姓都是一个单词。
//第4项是官方统计的球员上场次数。
//接着3项分别是击中数、走垒数和打点（RBI）。
//文件可能包含多场比赛的数据，所以同一位球员可能有多行数据，
//而且同一位球员的多行数据之间可能有其他球员的数据。
//编写一个程序，把数据储存到一个结构数组中。
//该结构中的成员要分别表示球员的名、姓、上场次数、击中数、走垒数、打点和安打率（稍后计算）。
//可以使用球员号作为数组的索引。
//该程序要读到文件结尾，并统计每位球员的各项累计总和。

//世界棒球统计与之相关。例如，一次走垒和触垒中的失误不计入上场次数，但是可能产生一个RBI。
//但是该程序要做的是像下面描述的一样读取和处理数据文件，不会关心数据的实际含义。

//要实现这些功能，最简单的方法是把结构的内容都初始化为零，
//把文件中的数据读入临时变量中，然后将其加入相应的结构中。
//程序读完文件后，应计算每位球员的安打率，并把计算结果储存到结构的相应成员中。
//计算安打率是用球员的累计击中数除以上场累计次数。这是一个浮点数计算。
//最后，程序结合整个球队的统计数据，一行显示一位球员的累计数据。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define MIN_PL_NUMB 0
#define MAX_PL_NUMB 18


struct player {
    char fname[20];
    char lname[20];
    int plnumb;
    int pltimes;/*上场次数*/
    int hit_numbers;   // 击中数
    int base_numbers;  // 走垒数
    int rbi;           // 跑点数
    double rate;/*安打率*/
};

int main(int size, char **argv) {
    FILE *file;
    if (size < 2) {
        printf("未输入文件名");
        exit(EXIT_FAILURE);
    }
    if ((file = fopen(argv[1], "r")) == NULL) {
        printf("无法打开文件");
        exit(EXIT_FAILURE);
    }
    struct player players[MAX_PL_NUMB + 1] = {
            {"", "", 0, 0, 0, 0, 0, 0.0f},
            {"", "", 0, 0, 0, 0, 0, 0.0f},
            {"", "", 0, 0, 0, 0, 0, 0.0f},
            {"", "", 0, 0, 0, 0, 0, 0.0f},
            {"", "", 0, 0, 0, 0, 0, 0.0f},
            {"", "", 0, 0, 0, 0, 0, 0.0f},
            {"", "", 0, 0, 0, 0, 0, 0.0f},
            {"", "", 0, 0, 0, 0, 0, 0.0f},
            {"", "", 0, 0, 0, 0, 0, 0.0f},
            {"", "", 0, 0, 0, 0, 0, 0.0f},
            {"", "", 0, 0, 0, 0, 0, 0.0f},
            {"", "", 0, 0, 0, 0, 0, 0.0f},
            {"", "", 0, 0, 0, 0, 0, 0.0f},
            {"", "", 0, 0, 0, 0, 0, 0.0f},
            {"", "", 0, 0, 0, 0, 0, 0.0f},
            {"", "", 0, 0, 0, 0, 0, 0.0f},
            {"", "", 0, 0, 0, 0, 0, 0.0f},
            {"", "", 0, 0, 0, 0, 0, 0.0f},
            {"", "", 0, 0, 0, 0, 0, 0.0f}
    };
    struct player temp;
    //获取文件中的信息
    while (feof(file) == 0) {
        int b = fscanf(file, "%d%s%s%d%d%d%d",
                       &temp.plnumb,
                       temp.fname,
                       temp.lname,
                       &temp.pltimes,
                       &temp.hit_numbers,
                       &temp.base_numbers,
                       &temp.rbi);
        //复制信息
        if (b == 7 && temp.plnumb >= 0 && temp.plnumb <= MAX_PL_NUMB) {
            players[temp.plnumb].plnumb = temp.plnumb;
            strcpy(players[temp.plnumb].fname, temp.fname);
            strcpy(players[temp.plnumb].lname, temp.lname);
            players[temp.plnumb].pltimes += temp.pltimes;
            players[temp.plnumb].hit_numbers += temp.hit_numbers;
            players[temp.plnumb].base_numbers += temp.base_numbers;
        }
    }

    for (int i = 0; i <= MAX_PL_NUMB; ++i) {
        players[i].rate = (double) players[i].hit_numbers / (double) players[i].pltimes;
        printf("Player:%s %s, play_times: %d, hit_number: %d, run barrier times: %d, rbi: %d, hit_rate: %.2f\n",
               players[i].fname, players[i].lname, players[i].pltimes, players[i].hit_numbers, players[i].base_numbers,
               players[i].rbi, players[i].rate
        );
    }
}